css: Round shadow extents properly
authorBenjamin Otte <otte@redhat.com>
Wed, 20 Aug 2014 21:19:59 +0000 (23:19 +0200)
committerBenjamin Otte <otte@redhat.com>
Wed, 20 Aug 2014 22:54:07 +0000 (00:54 +0200)
Otherwise drawing will be clipped.

Testcase included

gtk/gtkcssshadowsvalue.c
testsuite/reftests/Makefile.am
testsuite/reftests/shadow-clip-rounding.css [new file with mode: 0644]
testsuite/reftests/shadow-clip-rounding.ref.ui [new file with mode: 0644]
testsuite/reftests/shadow-clip-rounding.ui [new file with mode: 0644]

index 6aafa92ce4d8db66808a6209881b0a73a3812580..f99401adcfdc155d48ef18242d339ccc636feac9 100644 (file)
@@ -21,6 +21,8 @@
 
 #include "gtkcssshadowsvalueprivate.h"
 
+#include <math.h>
+
 #include "gtkcairoblurprivate.h"
 #include "gtkcssshadowvalueprivate.h"
 
@@ -337,10 +339,10 @@ _gtk_css_shadows_value_get_extents (const GtkCssValue *shadows,
                                           &radius, &spread);
       clip_radius = _gtk_cairo_blur_compute_pixels (radius);
 
-      b.top = MAX (0, clip_radius + spread - voffset);
-      b.right = MAX (0, clip_radius + spread + hoffset);
-      b.bottom = MAX (0, clip_radius + spread + voffset);
-      b.left = MAX (0, clip_radius + spread - hoffset);
+      b.top = MAX (0, ceil (clip_radius + spread - voffset));
+      b.right = MAX (0, ceil (clip_radius + spread + hoffset));
+      b.bottom = MAX (0, ceil (clip_radius + spread + voffset));
+      b.left = MAX (0, ceil (clip_radius + spread - hoffset));
 
       border->top = MAX (border->top, b.top);
       border->right = MAX (border->right, b.right);
index 103b523fdec1dc070b0ecf477bb4ef9840cf9c3c..f88876e90e2ff5f1a6e598341d4d1f814e100e78 100644 (file)
@@ -337,6 +337,9 @@ testdata = \
        separator-size.ui \
        set-default-direction.ui \
        set-default-direction.ref.ui \
+       shadow-clip-rounding.css \
+       shadow-clip-rounding.ref.ui \
+       shadow-clip-rounding.ui \
        shorthand-entry-border.css \
        shorthand-entry-border.ref.ui \
        shorthand-entry-border.ui \
diff --git a/testsuite/reftests/shadow-clip-rounding.css b/testsuite/reftests/shadow-clip-rounding.css
new file mode 100644 (file)
index 0000000..2a4912a
--- /dev/null
@@ -0,0 +1,9 @@
+@import "reset-to-defaults.css";
+
+.test {
+  box-shadow: 0 0.99999px red;
+}
+
+.reference {
+  box-shadow: 0 1px red;
+}
diff --git a/testsuite/reftests/shadow-clip-rounding.ref.ui b/testsuite/reftests/shadow-clip-rounding.ref.ui
new file mode 100644 (file)
index 0000000..31f744d
--- /dev/null
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.1 -->
+<interface>
+  <requires lib="gtk+" version="3.12"/>
+  <object class="GtkWindow" id="window1">
+    <property name="width_request">100</property>
+    <property name="height_request">100</property>
+    <property name="can_focus">False</property>
+    <property name="type">popup</property>
+    <child>
+      <object class="GtkLabel" id="label1">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="halign">center</property>
+        <property name="valign">center</property>
+        <property name="label" translatable="yes">X</property>
+        <style>
+          <class name="reference"/>
+        </style>
+      </object>
+    </child>
+  </object>
+</interface>
diff --git a/testsuite/reftests/shadow-clip-rounding.ui b/testsuite/reftests/shadow-clip-rounding.ui
new file mode 100644 (file)
index 0000000..0374162
--- /dev/null
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.1 -->
+<interface>
+  <requires lib="gtk+" version="3.12"/>
+  <object class="GtkWindow" id="window1">
+    <property name="width_request">100</property>
+    <property name="height_request">100</property>
+    <property name="can_focus">False</property>
+    <property name="type">popup</property>
+    <child>
+      <object class="GtkLabel" id="label1">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="halign">center</property>
+        <property name="valign">center</property>
+        <property name="label" translatable="yes">X</property>
+        <style>
+          <class name="test"/>
+        </style>
+      </object>
+    </child>
+  </object>
+</interface>